先说说今天学习设计模式的感想吧
之前看设计模式,觉得类图很重要
现在还觉得应用场景在脑海里一定要有一定的想法。
简单工厂
个人总结一句话:
只是当我们在一个方法中具体到某一对象大量的判断条件实例化时,把它相同的部分抽离,方便后期维护
/**
* 简单工厂
* 这边采用伪代码的形式
*/
public class Pizza {
SimplePizzaFactory factory;
public Pizza(SimplePizzaFactory factory){
this.factory = factory;
}
public Pizza orderPizza(String type){
//实例化
Pizza aPizza = factory.createPizza("aaa");
//具体某个pizza的操作
// aPizza.prepare();
// aPizza.bake();
//其他操作
return aPizza;
}
}
public class SimplePizzaFactory {
public Pizza createPizza(String type){
Pizza pizza = null;
if(type.equals("aaa")){
// pizza = new aaa();
}else if(type.equals("bbb")){
// pizza = new bbb();
}
//...
return pizza;
}
}
工厂方法模式
工厂方法模式 : 定义一个创建对象的接口,但由子类决定实例化的哪一个。工厂方法让类实例化推迟到子类
public abstract class Pizza {
public String name;
public String dough;
public String sauce;
void prepare(){
System.out.println("pprepare .."+ name);
System.out.println(dough);
System.out.println(sauce);
}
void bake(){
System.out.println("bake ...");
}
void cut(){
System.out.println("cut...");
}
void box(){
System.out.println("box...");
}
}
public class ChinesePizza extends Pizza {
public ChinesePizza(){
name = "中国味pizza";
sauce="salt";
dough = "em...";
}
}
public class JpPizza extends Pizza{
public JpPizza(){
name = "日本味pizza";
sauce="salt";
dough = "em...";
}
@Override
void cut(){
System.out.println("日本切法。。");
}
}
public abstract class PizzaStore {
//我自认为这就是抽象模式的面孔
protected abstract Pizza createPizza(String type);
public void orderPizza(String type){
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}
public class JpPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
Pizza pizza = null;
if(type.equals("zh")){
pizza = new ChinesePizza();
}else if(type.equals("jp")){
pizza = new JpPizza();
}
return pizza;
}
}
测试
public class Test {
public static void main(String[] args) {
PizzaStore pizzaStore = new ChinesePizzaStore();
pizzaStore.orderPizza("zh");
}
}
抽象工厂方法模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确具体类
上面的类图还是继续做pizza的规矩(在脑海里有个概念:之前工厂模式就是创建一个抽象类,具体的东西去实现该抽象类中的抽象方法。),现在抽象工厂(就是建立做pizza的方法,不同地方有不同地方的做法;现在做pizza的时候,把具体的工厂做法放进去)
代码如下:
//制作pizza的工厂
public interface PizzaIngredientFactory {
public Dough createDoutgh();
public Sauce createSauce();
public Cheese createCheese();
//...
}
//不同地方做pizza的实现
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDoutgh() {
System.out.println("ny..");
return new Dough();
}
@Override
public Sauce createSauce() {
return new Sauce();
}
@Override
public Cheese createCheese() {
return new Cheese();
}
}
// pizza店改造
// 做pizza的时候,根据不同地方的做法来实现pizza制作
public class JpPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
PizzaIngredientFactory pizzaIngredientFactory = new ZhPizzaIngredientFactory();
Pizza pizza = null;
if(type.equals("zh")){
pizza = new ChinesePizza(pizzaIngredientFactory);
}else if(type.equals("jp")){
pizza = new JpPizza(pizzaIngredientFactory);
}
return pizza;
}
}
来看看实际实现类中的pizza 变成了什么样子
public class ChinesePizza extends Pizza {
PizzaIngredientFactory pizzaIngredientFactory;
public ChinesePizza(PizzaIngredientFactory pizzaIngredientFactory){
this.pizzaIngredientFactory = pizzaIngredientFactory;
}
//根据传过来的工厂来创建做pizza的不同口味
@Override
void prepare() {
pizzaIngredientFactory.createCheese();
pizzaIngredientFactory.createDoutgh();
pizzaIngredientFactory.createSauce();
}
}
回过头自己总结了一下。
pizza 工厂只提供制作pizza的规范
pizza 的制作时依赖pizza工厂提供的配料的
pizza 店制作pizza,根据不同工厂做出来的cheese奶酪的pizza味道也是不一样的。