简单工厂模式
简单工厂模式是属于创建型模式, 是工厂模式的一种。 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
简单工厂模式: 定义了一个创建对象的类, 由这个类来封装实例化对象的行为(代码)
在软件开发中, 当我们会用到大量的创建某种、 某类或者某批对象时, 就会使用到工厂模式.
UML图:
- 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品
- 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
- 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
实现:
产品类(pizza):
abstract class Pizza {
public Pizza() {}
}
class CheesePizza extends Pizza {
public CheesePizza() {
System.out.println("make a CheesePizza");
}
}
class PepperPizza extends Pizza {
public PepperPizza() {
System.out.println("make a PepperPizza");
}
}
工厂类:
public class factory {
public Pizza CreatePizza(String name) {
if(name.equalsIgnoreCase("cheese")) {
return new CheesePizza();
}else if(name.equalsIgnoreCase("pepper")){
return new PepperPizza();
}
return null;
}
}
顾客类:
public class customer {
public static void main(String[] args) {
factory f=new factory();
Pizza p1=f.CreatePizza("cheese");
Pizza p2=f.CreatePizza("pepper");
}
}
在简单工厂中,每增加一种Pizza,都要在工厂类中增加相应的逻辑,工厂类十分被动,这样的工厂类成为全能类或者上帝类。
工厂方法模式
工厂方法模式设计方案: 将披萨项目的实例化功能抽象成抽象方法, 在不同的口味点餐子类中具体实现。
工厂方法模式: 定义了一个创建对象的抽象方法, 由子类决定要实例化的类。 工厂方法模式将对象的实例化推迟到子类
- 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
- 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
- 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
- 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的上帝类,分担了对象承受的压力。
实现:
产品类(pizza):
abstract class Pizza {
public Pizza() {}
}
class CheesePizza extends Pizza {
public CheesePizza() {
System.out.println("make a CheesePizza");
}
}
class PepperPizza extends Pizza {
public PepperPizza() {
System.out.println("make a PepperPizza");
}
}
工厂类:
interface factory {
public Pizza createPizza();
}
class CheesePizzaFactory implements factory{
public CheesePizza createPizza() {
return new CheesePizza();
}
}
class PepperPizzaFactory implements factory{
public PepperPizza createPizza() {
return new PepperPizza();
}
}
顾客类:
public class customer {
public static void main(String[] args) {
factory f1=new CheesePizzaFactory();
Pizza p1=f1.createPizza();
factory f2=new PepperPizzaFactory();
Pizza p2=f2.createPizza();
}
}
抽象工厂模式
抽象工厂模式: 定义了一个 interface 用于创建相关或有依赖关系的对象簇, 而无需指明具体的类
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
从设计层面看, 抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
将工厂抽象成两层, AbsFactory(抽象工厂) 和 具体实现的工厂子类。 程序员可以根据创建对象类型使用对应的工厂子类。 这样将单个的简单工厂类变成了工厂簇, 更利于代码的维护和扩展
UML图:
实现:
产品类(pizza):
abstract class Pizza {
public Pizza() {}
}
class BJCheesePizza extends Pizza {
public BJCheesePizza() {
System.out.println("make a BJCheesePizza");
}
}
class SHCheesePizza extends Pizza {
public SHCheesePizza() {
System.out.println("make a SHCheesePizza");
}
}
class BJPepperPizza extends Pizza {
public BJPepperPizza() {
System.out.println("make a BJPepperPizza");
}
}
class SHPepperPizza extends Pizza {
public SHPepperPizza() {
System.out.println("make a SHPepperPizza");
}
}
工厂类:
interface Absfactory {
public Pizza createPizza(String name);
}
class SHFactory implements Absfactory{
public Pizza createPizza(String name) {
if(name.equalsIgnoreCase("cheese")) {
return new SHCheesePizza();
}else if(name.equalsIgnoreCase("pepper")){
return new SHPepperPizza();
}
return null;
}
}
class BJFactory implements Absfactory{
public Pizza createPizza(String name) {
if(name.equalsIgnoreCase("cheese")) {
return new BJCheesePizza();
}else if(name.equalsIgnoreCase("pepper")){
return new BJPepperPizza();
}
return null;
}
}
顾客类:
public class customer {
public static void main(String[] args) {
Absfactory f1=new SHFactory();
Pizza p1=f1.createPizza("cheese");
Absfactory f2=new BJFactory();
Pizza p2=f2.createPizza("pepper");
}
}