网站底部代码特效,国外网站加速,天津网络推广网站建设公司,网页制作素材按钮图标目录
工厂方法模式
简介
优缺点
结构
使用场景
实现
1.抽象产品
2.具体产品
3.抽象工厂
4.具体工厂
5.调用
总结
抽象工厂模式
简介
结构
实现
区别 工厂方法模式
简介
提供一个用于创建对象的接口(工厂接口)#xff0c;让其实现类(工厂实现类)决定实例化哪…目录
工厂方法模式
简介
优缺点
结构
使用场景
实现
1.抽象产品
2.具体产品
3.抽象工厂
4.具体工厂
5.调用
总结
抽象工厂模式
简介
结构
实现
区别 工厂方法模式
简介
提供一个用于创建对象的接口(工厂接口)让其实现类(工厂实现类)决定实例化哪一个类(产品类)并且由该实现类创建对应类的实例
被创建的对象称为“产品”把创建产品的对象称为“工厂”
工厂方法模式”是对简单工厂模式的进一步抽象化其好处是可以使系统在不修改原来代码的情况下引进新的产品即满足开闭原则
优缺点
优点 1.用户只需要知道具体工厂的名称就可得到所要的产品无须知道产品的具体创建过程 2.灵活性增强对于新产品的创建只需多写一个相应的工厂类 3.典型的解耦框架
缺点 1.类的个数容易过多增加复杂度 2.增加了系统的抽象性和理解难度 3.抽象产品只能生产一种产品此弊端可使用抽象工厂模式解决
结构
角色 1.抽象工厂提供了创建产品的接口调用者通过访问具体工厂的工厂方法来创建产品 2.具体工厂实现抽象工厂里面的抽象方法完成具体产品的创建 3.抽象产品定义了产品的规范描述了产品的主要特性和功能 4.具体产品实现了抽象产品定义的接口由具体工厂来创建它通具体工厂之间对应
结构图 使用场景
1.客户只知道创建产品的工厂名而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等
2.创建对象的任务由多个具体子工厂中的某一个完成而抽象工厂只提供创建产品的接口
3.客户不关心创建产品的细节只关心产品的品牌
实现
1.抽象产品
interface Product {public void show();
}
2.具体产品
//具体产品1实现抽象产品中的抽象方法
class ConcreteProduct1 implements Product {public void show() {System.out.println(具体产品1显示...);}
}
//具体产品2实现抽象产品中的抽象方法
class ConcreteProduct2 implements Product {public void show() {System.out.println(具体产品2显示...);}
}
3.抽象工厂
//抽象工厂提供了厂品的生成方法
interface AbstractFactory {public Product newProduct();
}
4.具体工厂
//具体工厂1实现了厂品的生成方法
class ConcreteFactory1 implements AbstractFactory {public Product newProduct() {System.out.println(具体工厂1生成--具体产品1...);return new ConcreteProduct1();}
}
//具体工厂2实现了厂品的生成方法
class ConcreteFactory2 implements AbstractFactory {public Product newProduct() {System.out.println(具体工厂2生成--具体产品2...);return new ConcreteProduct2();}
}
5.调用
public static void main(String[] args) {try {Product a;AbstractFactory af;af (AbstractFactory) ReadXML1.getObject();a af.newProduct();a.show();} catch (Exception e) {System.out.println(e.getMessage());}}
总结 工厂方法模式是简单工厂模式的进一步抽象和推广由于使用了面向对象的多态性工厂方法模式保持了简单工厂的优点并且克服了缺点。
抽象工厂模式
简介
提供了一个创建一系列相关或相互依赖对象的接口而无需指定他们具体的类
结构
角色 抽象工厂声明了一组用于创建一组产品的方法每个方法对应一组产品 具体工厂实现了在抽象工厂中声明的创建产品的方法生成一组具体产品这些产品构成了一个产品组每一个产品都位于某个产品等级结构中 抽象产品为每种产品声明接口在抽象产品中声明了产品所具有的业务方法 具体产品定义具体工厂生产的具体产品对象实现抽象产品接口中声明的业务方法
结构图 实现
1.为形状创建一个接口 public interface Shape {void draw();
}2.创建实现接口的实体类 public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Inside Rectangle::draw() method.);}
}public class Square implements Shape {Overridepublic void draw() {System.out.println(Inside Square::draw() method.);}
}public class Circle implements Shape {Overridepublic void draw() {System.out.println(Inside Circle::draw() method.);}
}
3.为颜色创建一个接口 public interface Color {void fill();
}4.创建实现接口的实体类 public class Red implements Color {Overridepublic void fill() {System.out.println(Inside Red::fill() method.);}
}public class Green implements Color {Overridepublic void fill() {System.out.println(Inside Green::fill() method.);}
}public class Blue implements Color {Overridepublic void fill() {System.out.println(Inside Blue::fill() method.);}
}
5.为 Color 和 Shape 对象创建抽象类来获取工厂 public abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape) ;
}6.创建扩展了 AbstractFactory 的工厂类基于给定的信息生成实体类的对象 public class ShapeFactory extends AbstractFactory {Overridepublic Shape getShape(String shapeType){if(shapeType null){return null;} if(shapeType.equalsIgnoreCase(CIRCLE)){return new Circle();} else if(shapeType.equalsIgnoreCase(RECTANGLE)){return new Rectangle();} else if(shapeType.equalsIgnoreCase(SQUARE)){return new Square();}return null;}Overridepublic Color getColor(String color) {return null;}
}public class ColorFactory extends AbstractFactory {Overridepublic Shape getShape(String shapeType){return null;}Overridepublic Color getColor(String color) {if(color null){return null;} if(color.equalsIgnoreCase(RED)){return new Red();} else if(color.equalsIgnoreCase(GREEN)){return new Green();} else if(color.equalsIgnoreCase(BLUE)){return new Blue();}return null;}
}
7.创建一个工厂创造器/生成器类通过传递形状或颜色信息来获取工厂 public class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase(SHAPE)){return new ShapeFactory();} else if(choice.equalsIgnoreCase(COLOR)){return new ColorFactory();}return null;}
}8.使用 FactoryProducer 来获取 AbstractFactory通过传递类型信息来获取实体类的对象 public class AbstractFactoryPatternDemo {public static void main(String[] args) {//获取形状工厂AbstractFactory shapeFactory FactoryProducer.getFactory(SHAPE);//获取形状为 Circle 的对象Shape shape1 shapeFactory.getShape(CIRCLE);//调用 Circle 的 draw 方法shape1.draw();//获取形状为 Rectangle 的对象Shape shape2 shapeFactory.getShape(RECTANGLE);//调用 Rectangle 的 draw 方法shape2.draw();//获取形状为 Square 的对象Shape shape3 shapeFactory.getShape(SQUARE);//调用 Square 的 draw 方法shape3.draw();//获取颜色工厂AbstractFactory colorFactory FactoryProducer.getFactory(COLOR);//获取颜色为 Red 的对象Color color1 colorFactory.getColor(RED);//调用 Red 的 fill 方法color1.fill();//获取颜色为 Green 的对象Color color2 colorFactory.getColor(Green);//调用 Green 的 fill 方法color2.fill();//获取颜色为 Blue 的对象Color color3 colorFactory.getColor(BLUE);//调用 Blue 的 fill 方法color3.fill();}
}区别
1.工厂方法模式只有一个抽象产品类抽象工厂模式有多个
2.工厂方法模式的具体工厂类只能创建一个具体产品类的实例而抽象工厂模式可以创建多个
3.工厂方法模式 一个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例