笑话网站html模板,买淘宝店铺多少钱一个,网站被网站建设的人控制了,杭州百度整站优化服务在java中#xff0c;万物皆对象#xff0c;这些对象都需要创建#xff0c;如果创建的时候直接new该对象#xff0c;就会对该对象耦合严重#xff0c;假如我们要更换对象#xff0c;所有new对象的地方都需要修改一遍#xff0c;这显然违背了软件设计的开闭原则。如果我们…在java中万物皆对象这些对象都需要创建如果创建的时候直接new该对象就会对该对象耦合严重假如我们要更换对象所有new对象的地方都需要修改一遍这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象我们就只和工厂打交道就可以了彻底和对象解耦如果要更换对象直接在工厂里更换该对象即可达到了与对象解耦的目目的所以说工厂模式最大的优点就是解耦。
简单工厂不属于GOF23种设计模式之一 不是一种设计模式更像是一种编码习惯 要学习工厂方法必须先了解什么是简单工厂
结构
抽象产品定义了产品的规范描述了产品的主要特性和功能。具体产品实现或者继承抽象产品的子类即产品本身。具体工厂提供了创建产品的方法调用者通过该方法来进行产品的创建
优点
封装了创建对象的过程可以通过参数直接获取对象。把对象的创建和业务逻辑层分开这样以后就避免了修改客户代码如果要实产品直接修改工厂类而不需要在原代码中修改这样就降低了客户代码修改的可能性更加容易扩展。
缺点
增加新产品时还是需要修改工厂类的代码违背了“开闭原则
// 定义一个接口或抽象类
interface Shape {void draw();
}// 定义具体的产品类
class Circle implements Shape {Overridepublic void draw() {System.out.println(Drawing a circle...);}
}class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Drawing a rectangle...);}
}// 定义简单工厂类
class ShapeFactory {// 工厂方法根据输入参数决定创建哪种产品public static Shape getShape(String type) {if (circle.equalsIgnoreCase(type)) {return new Circle();} else if (rectangle.equalsIgnoreCase(type)) {return new Rectangle();} else {throw new IllegalArgumentException(Invalid shape type: type);}}
}// 客户端代码
public class Client {public static void main(String[] args) {// 使用简单工厂创建不同形状的对象Shape circle ShapeFactory.getShape(circle);circle.draw(); // 输出: Drawing a circle...Shape rectangle ShapeFactory.getShape(rectangle);rectangle.draw(); // 输出: Drawing a rectangle...// 尝试创建无效类型try {Shape invalidShape ShapeFactory.getShape(triangle);} catch (IllegalArgumentException e) {System.out.println(e.getMessage());}}
}
在这个例子中ShapeFactory是简单工厂它负责根据传入的字符串类型创建相应的形状对象。客户端代码只需调用工厂方法不需要关心具体的创建过程。
工厂方法
针对上例中的缺点使用工厂方法模式就可以完美的解决完全遵循开闭原则。 定义一个用于创建对象的接口让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。 结构
抽象工厂(Abstract Factory):提供了创建产品的接口调用者通过它访问具体工厂的工厂方法来创建产品。具体工厂(Concreteractory):主要是实现抽象工厂中的抽象方法完成具体产品的创建。抽象产品(product):定义了产品的规范描述了产品的主要特性和功能。具体产品(ConcreteProduct实现了抽象产品角色所定义的接口由县体工厂来创建它同县体工厂之间一一对应
将简单工厂模式升级为工厂方法模式我们需要将创建具体产品的逻辑移到每个具体工厂类中而不是集中在一个静态工厂方法中。以下是将简单工厂模式转换为工厂方法模式的Java代码示例
// 定义一个接口或抽象类
interface Shape {void draw();
}// 定义具体的产品类
class Circle implements Shape {Overridepublic void draw() {System.out.println(Drawing a circle...);}
}class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Drawing a rectangle...);}
}// 定义抽象工厂类
abstract class ShapeFactory {// 抽象工厂方法由子类实现以创建具体产品public abstract Shape getShape();
}// 定义具体工厂类
class CircleFactory extends ShapeFactory {Overridepublic Shape getShape() {return new Circle();}
}class RectangleFactory extends ShapeFactory {Overridepublic Shape getShape() {return new Rectangle();}
}// 客户端代码
public class Client {public static void main(String[] args) {// 使用工厂方法模式创建不同形状的对象ShapeFactory circleFactory new CircleFactory();Shape circle circleFactory.getShape();circle.draw(); // 输出: Drawing a circle...ShapeFactory rectangleFactory new RectangleFactory();Shape rectangle rectangleFactory.getShape();rectangle.draw(); // 输出: Drawing a rectangle...// 如果需要添加更多形状只需要创建更多的具体工厂类即可这里不再演示创建三角形的工厂类}
}
在这个工厂方法模式的示例中我们创建了一个抽象工厂类ShapeFactory并在其中定义了抽象方法getShape()。然后我们分别为每种形状创建了具体工厂类如CircleFactory和RectangleFactory并在这些类中实现创建相应形状对象的逻辑。客户端代码现在可以根据需求实例化不同的具体工厂类来创建所需形状对象。
优点
用户只需要知道具体工厂的名称就可得到所要的产品无须知道产品的具体创建过程在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类无须对原工厂进行任何修改满足开闭原则
缺点
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类这增加了系统的复杂度。
典型案例 Collection.iterator
ListString list Arrays.asList(a,b,c,d);
IteratorString iterator list.iterator();
// ArrayList部分源码
public interface AbstractListE extends AbstractCollectionE implements ListE {// Iteratorspublic IteratorE iterator() {return new Itr();}public ListIteratorE listIterator() {return listIterator(0);}public ListIteratorE listIterator(final int index) {rangeCheckForAdd(index);return new ListItr(index);}private class Itr implements IteratorE{...}private class ListItr extends Itr implements ListIteratorE{...}}
// Collection 部分源码
public interface CollectionE extends IterableE {IteratorE iterator();
}
// Interator部分源码
public interface IteratorE {boolean hasNext();E next();
}在Collection中定义了Iterator的抽象方法而ArrayList又继承Collection并在类中重写了Interator的方法。 也就是说ArrayList类是在工厂类中创建了Iterator 和ListIterator 的产品。即
Collection接口是抽象工厂类ArrayList是具体的工厂类Iterator接口是抽象商品类ArrayList类中的Iter和ListItr是具体的商品类。 在具体的工厂类中iterator()方法是创建具体的商品类对象。