1. 简单工厂模式
1.1 基本介绍
- 简单工厂模式属于创建型模式, 是工厂模式的一种. 简单工厂模式是由一个工厂对象决定创建哪一个产品类的实例, 简单工厂模式是工厂模式家族中最简单实用的模式
- 简单工厂模式: 定义一个创建对象的类, 由这个类来封装实例化对象的行为
- 软件开发中, 我们大量创建某类 或 某批对象就会用到工行模式
1.2 案例:
package com.liyang;
// Step1: 披萨有很多种, 我们做一个抽象类, 然后让别的来泛化它
public abstract class Pizza {
// 制作披萨
public void make(){
}
// 打包披萨
public void box() {
}
}
package com.liyang;
public class CheesePizza extends Pizza {
@Override
public void make() {
System.out.println("制作奶酪披萨...");
}
@Override
public void box() {
System.out.println("打包奶酪披萨...");
}
}
package com.liyang;
public class GreekPizza extends Pizza {
@Override
public void make() {
System.out.println("制作Greek披萨...");
}
@Override
public void box() {
System.out.println("打包Greek披萨...");
}
}
package com.liyang;
// Step2: 销售披萨的店铺, 做成一个类
public class PizzaStore {
public static void main(String[] args) {
OrderPizza orderPizza = new OrderPizza(new SingletonFactory());
orderPizza.useFactory();
}
}
package com.liyang;
// Step3: PizzaStore类 和 Pizza类之间是订购的关系, 做成一个订购类
public class OrderPizza {
SingletonFactory singletonFactory = null;
public OrderPizza(SingletonFactory singletonFactory) {
this.singletonFactory = singletonFactory;
}
public void useFactory() {
singletonFactory.makePizza("GreekPizza");
}
}
package com.liyang;
// Step4: OrderPizza类如果直接和Pizza类发生关系, 那么假设现在增加了一种新型披萨
// 那么我们首先会增加一个 新型披萨类 让他去实现Pizza, 然后将OrderPizza类的代码改变
// 但是现在有1万中OrderPizza(手机订购, 实体店购买, 饿了么, 美团...), 这1万个全改吗??
// 所以我们在这里做一个简单工厂来解决这种问题...
public class SingletonFactory {
Pizza pizza = null;
public void makePizza(String pizzaType) {
if (pizzaType == "CheesePizza") {
pizza = new CheesePizza();
} else if (pizzaType == "GreekPizza") {
pizza = new GreekPizza();
} else {
System.out.println("不好意思, 没有这种类型...");
}
pizza.make();
pizza.box();
}
}
2. 工厂方法模式
package com.liyang;
// Step1: 披萨有很多种, 我们做一个抽象类, 然后让别的来泛化它
public abstract class Pizza {
// 制作披萨
public void make(){
}
// 打包披萨
public void box() {
}
}
package com.liyang;
public class BJCheesePizza extends Pizza {
@Override
public void make() {
System.out.println("制作奶酪披萨...");
}
@Override
public void box() {
System.out.println("打包奶酪披萨...");
}
}
package com.liyang;
public class SHGreekPizza extends Pizza {
@Override
public void make() {
System.out.println("制作Greek披萨...");
}
@Override
public void box() {
System.out.println("打包Greek披萨...");
}
}
package com.liyang;
// Step2: 销售披萨的店铺, 做成一个类
public class PizzaStore {
public static void main(String[] args) throws Exception {
// 根据不同的城市选择不同的城市的实现类
String privince = "BJ";
if (privince == "BJ") {
new BJOrderPizza();
} else {
throw new Exception("没有这个城市...");
}
}
}
package com.liyang;
// Step3: PizzaStore类 和 Pizza类之间是订购的关系, 做成一个订购类 抽象的
public abstract class OrderPizza {
// 抽象方法, 让具体的类去实现
public abstract void createPizza(String orderType);
public OrderPizza() {
createPizza("Cheese");
}
}
package com.liyang;
public class BJOrderPizza extends OrderPizza {
@Override
public void createPizza(String orderType) {
if (orderType == "Cheese") {
System.out.println("创建BJ的Cheese披萨...");
} else {
System.out.println("没有这种类型...");
}
}
}
3. 抽象工厂模式
- 定义一个interface用于创建相关或有依赖关系的对象簇而无需指明类
- 抽象方法模式可以将简单工厂模式和工厂方法模式进行整合
- 从设计层面看, 抽象工厂模式就是对简单工厂模式的改进
- 将工厂抽象成两层, AbsFactory(抽象工厂) 和 具体的实现工厂子类. 程序员可以根据创建对象类型使用相应工厂子类. 这样将单个简单工厂变成工厂簇, 更利于代码的维护和扩展…
package com.liyang;
// Step1: 披萨有很多种, 我们做一个抽象类, 然后让别的来泛化它
public abstract class Pizza {
// 制作披萨
public void make(){
}
// 打包披萨
public void box() {
}
}
package com.liyang;
public class BJCheesePizza extends Pizza {
@Override
public void make() {
System.out.println("制作奶酪披萨...");
}
@Override
public void box() {
System.out.println("打包奶酪披萨...");
}
}
package com.liyang;
public class SHGreekPizza extends Pizza {
@Override
public void make() {
System.out.println("制作Greek披萨...");
}
@Override
public void box() {
System.out.println("打包Greek披萨...");
}
}
package com.liyang;
// Step2: 销售披萨的店铺, 做成一个类
public class PizzaStore {
public static void main(String[] args) throws Exception {
OrderPizza orderPizza = new OrderPizza();
orderPizza.useFactory();
}
}
package com.liyang;
// Step3: PizzaStore类 和 Pizza类之间是订购的关系, 做成一个订购类
public class OrderPizza {
public void useFactory() {
String privice = "BJ";
String orderPizza = "Cheese";
if (privice == "BJ") {
BJFactory bjFactory = new BJFactory();
bjFactory.createPizza(orderPizza);
} else {
System.out.println("没有这个城市...");
}
}
}
package com.liyang;
// Step4: 抽象工厂
public interface AbsFactory {
public void createPizza(String orderType);
}
package com.liyang;
public class BJFactory implements AbsFactory {
@Override
public void createPizza(String orderType) {
if (orderType == "Cheese") {
System.out.println("制作BJ的Cheese披萨...");
} else {
System.out.println("没有这种披萨...");
}
}
}